package javabase.base.client02;

/**
 * @author chengshuai
 * @date 2021/4/25 14:16
 */
public class Test021 {


    public static void main(String[] args) {
        f1();
        f2();
        f3();
    }

    /**
     * str1直接返回的是堆中的引用，所以二者相等
     */
    public static void f1() {
        //这种情况，不会在堆中创建str01字符串，这种相当于两个引用的相加
        String str2 = new String("str")+new String("01");
        str2.intern();
        String str1 = "str01";
        //true
        System.out.println(str2==str1);
    }

    /**
     * new String都是在堆上创建字符串对象。当调用 intern() 方法时，
     * 编译器会将字符串添加到常量池中（stringTable维护），并返回指向该常量的引用。
     */
    public static void f2() {
        String str2 = new String("str")+new String("01");
        String str1 = "str01";
        str2.intern();
        //false
        System.out.println(str2==str1);
    }

    /**
     * intern方法常量池没有才放引用
     * new String(str)会直接把字符串放入常量池
     * */
    public static void f3() {
        String s1 = new String("1");
        //这种常量池中已经有了,不可以放引用
        s1.intern();
        String s2 = "1";
        //false
        System.out.println(s1 == s2);
        //这种常量池不存在,可以放引用
        String s3 = new String("1") + new String("1");
        s3.intern();
        String s4 = "11";
        //true
        System.out.println(s3 == s4);
    }

}

/**
 * true
 * false
 * false
 * true
 */
